package com.mchina.myMaven.rest.dao;

import java.io.Serializable;
import java.util.List;

/**
 * Created by IntelliJ IDEA.
 * User: 徐书兵
 * Date: 11-12-5
 * Time: 下午6:13
 */
public interface BaseDao<T extends Serializable> {
    /**
     * 通过ID查找对象
     *
     * @param id   记录的ID
     * @param lock 是否锁定对象
     * @return 实体对象
     */
    public T load(Serializable id, boolean lock);

    public T get(Serializable id);

    /**
     * 通过ID查找对象,不锁定对象
     *
     * @param id 记录的ID
     * @return 实体对象
     */
    public T load(Serializable id);

    /**
     * 查找所有对象
     *
     * @return 对象列表
     */
    public List<T> findAll();


    /**
     * 按属性查找对象列表.
     */
    public List<T> findByProperty(String property, Object value);

    /**
     * 按属性查找唯一对象.
     */
    public T findUniqueByProperty(String property, Object value);

    /**
     * 按属性查找对象的数量
     *
     * @param property
     * @param value
     * @return
     */
    public int countByProperty(String property, Object value);

    public int countByProperty(String[] property, Object[] value);


    /**
     * 保存对象
     *
     * @param entity 实体对象
     * @return 实体对象
     */
    public T save(T entity)  ;

    /**
     * 更新对象
     *
     * @param entity 实体对象
     * @return 实体对象
     */
    public Object update(Object entity);

    /**
     * 保存或更新对象
     *
     * @param entity 实体对象
     * @return 实体对象
     */
    public Object saveOrUpdate(Object entity);

    /**
     * 保存或更新对象拷贝
     *
     * @param entity
     * @return 已更新的持久化对象
     */
    public Object merge(Object entity);

    /**
     * 删除对象
     *
     * @param entity 实体对象
     */
    public void delete(Object entity);

    /**
     * 根据ID删除记录
     *
     * @param id 记录ID
     */
    public T deleteById(Serializable id);

    /**
     * 刷新对象
     *
     * @param entity
     */
    public void refresh(Object entity);

    /**
     * 获得实体Class
     *
     * @return
     */
    public Class<T> getPersistentClass();

    /**
     * 创建实体类的对象
     *
     * @return
     */
    public T createNewEntiey();


}
